﻿// 0918train02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <vector>
#include <unordered_map>
#include <unordered_set>

using namespace std;

/*
 请实现一个简易内存池,根据请求命令完成内存分配和释放。
内存池支持两种操作命令，REQUEST和RELEASE，其格式为:
REQUEST=请求的内存大小 表示请求分配指定大小内存
，如果分配成功，返回分配到的内存首地址；
如果内存不足，或指定的大小为0，则输出error
RELEASE=释放的内存首地址
表示释放掉之前分配的内存，释放成功无需输出，
如果释放不存在的首地址则输出error

注意:
1. 内存池总大小为100字节。
2. 内存池地址分配必须是连续内存，并优先从低地址分配。
3. 内存释放后可被再次分配，已释放的内存在空闲时不能被二次释放。
4. 不会释放已申请的内存块的中间地址。
5. 释放操作只是针对首地址所对应的单个内存块进行操作，不会影响其它内存块。

输入描述
首行为整数N，表示操作命令的个数，取值范围0<N<=100
接下来的N行，每行将给出一个操作命令，操作命令和参数之间用"="分割

输出描述
REQUEST=请求的内存大小
如果内存不足，或指定的大小为0，则输出error

RELEASE=释放的内存首地址
释放成功无需输出，释放不存在的首地址则输出error

输入
2
REQUEST=10
REQUEST=20
输出
0
10

输入
5
REQUEST=10
REQUEST=20
RELEASE=20
RELEASE=10
REQUEST=10
输出
0
10
error
10
 */
class Solution01
{
public:
    int handleReq(int target_len)
    {
        vector<vector<int>>new_interval = { {-1,0} };
        for (auto&item: interval_vec)
        {
            new_interval.push_back(item);
        }
        new_interval.push_back({ 100,101 });

        vector<int>curr_v;
        int v_size = new_interval.size();
        for (int i=1; i<v_size; i++)
        {
            int last_end = new_interval[i - 1][1];
            int curr_start = new_interval[i][0];
            if (curr_start-last_end>= target_len)
            {
                curr_v.push_back(last_end);
                curr_v.push_back(last_end + target_len);
                break;
            }
	        //for
        }

        if (!curr_v.empty())
        {
            interval_vec.push_back(curr_v);
            sort(interval_vec.begin(), interval_vec.end(), [](vector<int>& vec_1, vector<int>& vec_2)
                {
                    return vec_1[0] < vec_2[0];
                });
            return curr_v[0];
        }
        return -1;
        
        //handleReq
    }

    int handleRelease(int start_i)
    {
        int v_size = interval_vec.size();
        for (int i=0; i< v_size; i++)
        {
            vector<int>item = interval_vec[i];
            if (item[0]==start_i)
            {
                interval_vec.erase(interval_vec.begin() + i);
                return 0;
            }
        }
        return -1;
	    //RELEASE
    }

    Solution01(vector<string>&order_vec)
    {
        //REQUEST, 推进interval
        //RELEASE, 找到对应的interval[0]
        vector<string>result;
        for (auto&order_str:order_vec)
        {
            int pos = order_str.find('=');
            string kind = order_str.substr(0, pos);
            string num_str = order_str.substr(pos + 1);

            if (kind=="REQUEST")
            {
                int length = stoi(num_str);
                if (length==0)
                {
                    result.push_back("error");
                    continue;
                }
                
                int req_i = handleReq(length);
                if (req_i==-1)
                {
                    result.push_back("error");
                    continue;
                }
                result.push_back(to_string(req_i));
	            //REQUEST
            }

            if (kind=="RELEASE")
            {
                int start_i = stoi(num_str);
                int res = handleRelease(start_i);

                if (res==-1)
                {
                    result.push_back("error");
                }
	            //RELEASE
            }

            //for
        }

        for (auto&res:result)
        {
            cout << res << endl;
        }

	   //Solution01 
    }
private:
    vector<vector<int>>interval_vec;
};


/*
 一段码流中的信元用 tag 标识，
 tag 在码流中唯一不重复，
 length 表示信元 value 的长度，value 表示信元的值，
 码流以某信元的 tag 开头，tag固定占一个字节，length固定占两个字节，字节序为小端序

现给定 TLV 格式编码的码流以及需要解码的信元 tag，请输出该信元的value
输入码流的 16 进制字符中，不包括小写字母；且要求输出的 16 进制字符串中也不要包含小写字母；
码流字符串的最大长度不超过 50000 个字节

输入描述
第一行为第一个字符串 ，表示待解码信元的 tag
输入第二行为一个字符串，表示待解码的 16 进制码流；字节之间用 空格 分割

输出描述
输出一个字符串，表示待解码信元以 16 进制表示的 value

输入
31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC

输出
32 33
 */
class Solution02
{
public:
    int getLength(vector<string>& str_vec, int index)
    {
        string hex_str = str_vec[index + 1];
        hex_str =  str_vec[index + 2]+ hex_str;

        int curr_val = stoi(hex_str, nullptr, 16);
        return curr_val;
        //getLength
    }

    vector<string>getValue(vector<string>& str_vec, int index, int length)
    {
        vector<string>val_vec;
        for (int i= index; i< index+length; i++)
        {
            val_vec.push_back(str_vec[i]);
        }
        return val_vec;
        //getValue
    }

    Solution02(string&search_tag, vector<string>&str_vec)
    {
        int index = 0;
        int v_size = str_vec.size();

        vector<string>result;
        while (index<v_size)
        {
            string curr_tag = str_vec[index];
            int val_length = getLength(str_vec, index);
            index += 3;
            if (curr_tag==search_tag)
            {
                result = getValue(str_vec, index, val_length);
                break;
            }
            index += val_length;
	        //while
        }

        for (auto&res:result)
        {
            cout << res << ' ';
        }

	    //Solution02
    }
};


int main()
{
	{
        string search_tag;
        getline(cin, search_tag);

        string input;
        getline(cin, input);
        stringstream oh_sstream(input);
        string token;
        vector<string>str_vec;
        while (oh_sstream>>token)
        {
            str_vec.push_back(token);
        }

        Solution02 solu(search_tag, str_vec);

        return 0;
	}
    int v_size;
    cin >> v_size;
    vector<string>order_vec(v_size);
    for (int i=0; i<v_size; i++)
    {
        cin >> order_vec[i];
    }

    Solution01 solu(order_vec);
    
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
